#/usr/bin/perl
<<DOC;
JANVIER 2018
 usage : perl parcours-arborescence-fichiers repertoire-a-parcourir rubrique
 Par exemple : perl parcours-arborescence-fichiers-2018.pl 2017 3208
 Le programme prend en entr�e le nom du r�pertoire contenant les fichiers � traiter et le "nom" de la rubrique � traiter
DOC
#
#-----------------------------------------------------------
my $rep="$ARGV[0]";
my $rubrique="$ARGV[1]";
my %redondant;
$rep=~ s/[\/]$//;

open(FILEOUT, ">:encoding(utf8)", "sortie_$rubrique.txt");
open(XML,">:encoding(utf-8)","xml-sortie_$rubrique.xml");
print XML '<?xml version="1.0" encoding="UTF-8"?>' ;
print XML '<racine>\n';
print XML '<nom>ZHOU Xiaofang & XUE Qing</nom>\n';


# on s'assure que le nom du r�pertoire ne se termine pas par un "/"
my $cptitem=0;
#----------------------------------------
&parcoursarborescencefichiers($rep);	# on lance la r�cursion.... et elle se terminera apr�s examen de toute l'arborescence
#----------------------------------------
print XML '</racine>\n';
close XML;
close FILEOUT;
exit;
#----------------------------------------------
sub parcoursarborescencefichiers {
    #on prend le premier element et devient la valeur de retour de $path
    my $path = shift(@_);
    #ouvre le repertoire
    opendir(DIR, $path) or die "can't open $path: $!\n";
    my @files = readdir(DIR);
    closedir(DIR);
    foreach my $file (@files) {
		next if $file =~ /^\.\.?$/;
		next if $file =~ /^\._/;
    next if $file =~ /^fil/;
		$file = $path."/".$file;
		if (-d $file) { #si c'est un rep on l'ouvre
			print "<NOUVEAU REPERTOIRE> ==> ",$file,"\n";
			&parcoursarborescencefichiers($file);	#recurse!
			print "<FIN REPERTOIRE> ==> ",$file,"\n";
		}
		if (-f $file) {
            if ($file =~ m/.*$rubrique.+\.xml$/) {
                print "<",$i++,"> ==> ",$file,"\n"; #compteur
                open(FILEIN, "<:encoding(utf8)", $file);
                open(FILEOUT, ">>:encoding(utf8)", "sortie_$rubrique.txt");
                open(XML,">>:encoding(utf-8)","xml-sortie_$rubrique.xml");
                my $ensemble="";
                while (my $ligne=<FILEIN>) {
                    chomp $ligne;
                    $ligne =~ s/\r//g;
                    $ligne =~ s/&amp//g;
                    $ensemble = $ensemble . $ligne ;
                }
                close FILEIN;
                $ensemble=~ s/>\s+</></g;
                while ($ensemble =~ m/<item>.*?<title>(.+?)<\/title>.*?<description>(.+?)<\/description>.*?<\/item>/g){
                       my $title = $1;
                    	 my $description=$2;
                    if (!(exists ($redondant{$title})))
                        {
                         $redondant{$title}=1;
                         my ($titre_propre,$description_propre) = &nettoyage ($title,$description);
                         print FILEOUT "$titre_propre\n";
                         print FILEOUT "$description_propre\n";
                         $cptitem++;
                         my ($titre_etiq,$description_etiq)= &etiquetage($titre_propre,$description_propre);
                         print XML "<item num=\"$cptitem\"><titre>$titre_etiq</titre><description>$description_etiq</description></item>\n";


                        }
                }
                close FILEOUT;
                close XML
            }

		}
    }
}
#----------------------------------------------

sub nettoyage {
    my $var1 = shift(@_);
    my $var2 = shift(@_);
    $var1=~s/&lt;.+?&gt;//g; # nettoyage � compl�ter...
    $var2=~s/&lt;.+?&gt;//g; # nettoyage � compl�ter...
    return $var1,$var2 ;
}

# la variable $/ est par defaut de perl qui signifie \n retour � la ligne.
#DONC pour lire le fichier xml en tout et prendre son contenu sans l'ent�te de treetagger on doit faire S/="" on change le comportement de lecture de perl
sub etiquetage {
	my $var1 = shift(@_); #uniquement aux variables entre � l'interieur des accolades
	my $var2= shift(@_);
	#------------------------------------
	open (OUT,">>:encoding(utf8)","titre_tmp.txt");
	print OUT $var1;
	close OUT ; #on doit le fermer avant le traiter avant un autre programme

	system("perl tokenise-utf8.pl titre_tmp.txt |./tree-tagger -lemma -token -no-unknown french-oral-utf-8.par > titre_etiquette.txt");
	system("perl treetagger2xml-utf8.pl titre_etiquette.txt utf8");

	$/="";  # la variable $/ est par defaut de perl qui signifie \n retour � la ligne.
#DONC pour lire le fichier xml en tout et prendre son contenu sans l'ent�te de treetagger on doit faire S/="" on change le comportement de lecture

	open (fichierxml,"<:encoding(utf8)","titre_etiquette.txt.xml");

	my $titre_retour=<fichierxml>;

	$titre_retour =~ s/<\?xml version="1.0" encoding="utf-8" standalone="no"\?>/\r\n/g;
	#<\?xml version="1.0" encoding="utf-8" standalone="no"\?>
	close(fichierxml);

	#--------------------------------

	open (description,">>:encoding(utf8)","description_tmp.txt");
	print description $var2;
	close description ; #on doit le fermer avant le traiter avant un autre programme

	system("perl tokenise-utf8.pl description_tmp.txt|./tree-tagger -lemma -token -no-unknown french-oral-utf-8.par > description_etiquette.txt");
	system("perl treetagger2xml-utf8.pl description_etiquette.txt utf8");


	open (fichierxml,"<:encoding(utf8)","description_etiquette.txt.xml");
	my $description_retour=<fichierxml>;
	$description_retour =~ s/<\?xml version="1\.0" encoding="utf-8" standalone="no"\?>/\r\n/g;
	close fichierxml;

	return ($titre_retour,$description_retour);

}
